package com.wj.sort;

/**
 * @author wen.jie
 * @date 2021/8/24 14:07
 */
public class HeapSort {

    public static void sort(Comparable[] pq) {
        int n = pq.length;

        // 构造堆
        for (int k = n/2; k >= 1; k--)
            //从长度一半处开始(跳过大小为1的堆)
            sink(pq, k, n);

        // 排序
        int k = n;
        while (k > 1) {
            //交换第一个最大的元素和第k个元素
            exch(pq, 1, k--);
            //下沉重排堆,就可以得到第1个到第k-1个最大的元素
            sink(pq, 1, k);
        }
    }

    private static void sink(Comparable[] pq, int k, int n) {
        while (2*k <= n) {
            int j = 2*k;
            if (j < n && less(pq, j, j+1)) j++;
            if (!less(pq, k, j)) break;
            exch(pq, k, j);
            k = j;
        }
    }

    private static boolean less(Comparable[] pq, int i, int j) {
        return pq[i-1].compareTo(pq[j-1]) < 0;
    }

    private static void exch(Object[] pq, int i, int j) {
        Object swap = pq[i-1];
        pq[i-1] = pq[j-1];
        pq[j-1] = swap;
    }

}
